35. Get Pseudo Ranges
In the previous exercises we manually executed the steps for determining pseudo ranges and our observation model probability. Now let's implement a function that accepts a vector of landmark positions, a pseudo position (x), and returns a vector of sorted (ascending) pseudo ranges. Later, we will use the pseudo range vector as an input for our observation model function.
To implement the
pseudo_range_estimator
function we must do the following for each pseudo position x:
-
For each landmark position:
- determine the distance between each pseudo position x and each landmark position
- if the distance is positive (landmark is forward of the pseudo position) push the distance to the pseudo range vector
- sort the pseudo range vector in ascending order
- return the pseudo range vector
There may be missing x values in the output. This is because not all x values have a forward landmark (positive pseudo range).
Start Quiz:
#include <algorithm>
#include <iostream>
#include <vector>
#include "helpers.h"
using std::vector;
// set standard deviation of control:
float control_stdev = 1.0f;
// meters vehicle moves per time step
float movement_per_timestep = 1.0f;
// number of x positions on map
int map_size = 25;
// define landmarks
vector<float> landmark_positions {5, 10, 12, 20};
// declare pseudo_range_estimator function
vector<float> pseudo_range_estimator(vector<float> landmark_positions,
float pseudo_position);
int main() {
// step through each pseudo position x (i)
for (int i = 0; i < map_size; ++i) {
float pseudo_position = float(i);
// get pseudo ranges
vector<float> pseudo_ranges = pseudo_range_estimator(landmark_positions,
pseudo_position);
// print to stdout
if (pseudo_ranges.size() > 0) {
for (int s = 0; s < pseudo_ranges.size(); ++s) {
std::cout << "x: " << i << "\t" << pseudo_ranges[s] << std::endl;
}
std::cout << "-----------------------" << std::endl;
}
}
return 0;
}
// TODO: Complete pseudo range estimator function
vector<float> pseudo_range_estimator(vector<float> landmark_positions,
float pseudo_position) {
// define pseudo observation vector
vector<float> pseudo_ranges;
// loop over number of landmarks and estimate pseudo ranges
// YOUR CODE HERE
// sort pseudo range vector
// YOUR CODE HERE
return pseudo_ranges;
}
#ifndef HELP_FUNCTIONS_H
#define HELP_FUNCTIONS_H
#include <math.h>
class Helpers {
public:
// definition of one over square root of 2*pi:
constexpr static float STATIC_ONE_OVER_SQRT_2PI = 1/sqrt(2*M_PI);
/**
* normpdf(X,mu,sigma) computes the probability function at values x using the
* normal distribution with mean mu and standard deviation std. x, mu and
* sigma must be scalar! The parameter std must be positive.
* The normal pdf is y=f(x,mu,std)= 1/(std*sqrt(2pi)) e[ -(x−mu)^2 / 2*std^2 ]
*/
static float normpdf(float x, float mu, float std) {
return (STATIC_ONE_OVER_SQRT_2PI/std)*exp(-0.5*pow((x-mu)/std,2));
}
};
#endif // HELP_FUNCTIONS_H